步骤yaml描述语言

本文将介绍自定义V2步骤FLOW-CLI工具的YAML描述语言。

步骤YAML描述语法

flow-cli step init 初始化模板step.yaml:

---
id: FlowCustomStep
name: 流水线自定义步骤
description: flow custom step demo
helpUrl: https://atomgit.com/flow-step-custom/Test
execution:
  executor: node
  main: dist/index.js
items:
  - label: input 参数
    name: abc
    type: input
    description: input 类型参数 abc
    value: hello world
  - label: password 参数
    name: your_password
    type: password
    description: password 类型参数 your_password
  - label: textarea 参数
    name: exclusion
    type: textarea
    value: |
      test/
      build/
    description: textarea 类型参数 exclusion
  - label: select 参数
    name: select_version
    type: select
    value: v1.0.0
    datasource:
      - label: "v1.0.0"
        value: v1.0.0
      - label: "v1.0.1"
        value: v1.0.1
      - label: "v1.0.2"
        value: v1.0.2
    description: select 类型参数 select_version
  - label: 参数 edf
    name: edf
    type: input
    showCondition: ${select_version} == "v1.0.0"
    description: 配置 showCondition,只有当 select_version == v1.0.0 才展示
  - label: 开关
    name: toggle
    type: checkbox
    value: false

字段

是否必填

说明

id

作为步骤 sign 取值,全局唯一,例如 HelloV2Step

name

步骤名称

description

步骤描述

helpUrl

帮助文档链接,一般为步骤对应仓库地址

execution

当前固定值为:

execution:

executor: node

main: dist/index.js

items

步骤参数定义,详见 Item 属性列表

Item 属性

属性名称

含义

是否必填

默认值

哪些 Type的item 可以使用

type

item的不同类型决定了其展现形式。

  • input 普通的输入框。

  • password 一个界面显示为星号的输入框。

  • textarea 一个普通文本域。

  • shell 一个对 bash 语法展示高亮的文本域。

  • select 下拉框。

  • checkbox 一个checkbox,选中时,值为true,未选中时,值为false。

不同类型 item 示例:

高的 (1)

全部

label

该 item 在表单中显示的标题

全部

name

作为该 item的唯一标识,使用驼峰形式。

  • name 需满足正则表达式 ^[a-zA-Z_-]+$

  • name 不允许为系统保留关键字:PIPELINE_ID、PIPELINE_NAME、EMPLOYEE_ID、BUILD_NUMBER、WORK_SPACE、PROJECT_DIR、PLUGIN_DIR 、BUILD_JOB_ID、stepIdentifier、versionName、version、type、name、sign。

全部

value

默认值

input

description

在item的右边显示一个问号,显示提示信息。

所有

datasource

数据源。

静态数据源的 value 是数组:

datasource:
  - label: 选项1
    value: value1
  - label: 选项2
    value: value2

select

showCondition

该 item 的显示条件,比如:

- name: abc
  label: 参数 abc
  type: select
  datasource:
    - label: 选项1
      value: 123
    - label: 选项2
      value: 456
- name: edf
  label: 参数 edf
  type: input
  showCondition: ${abc} == "123"

该示例标识,只有参数 abc 为选项 1 时,才展示参数 edf 的配置选项

所有

高级用法示例

使用 Java构建或者docker构建等前置任务的输出

step.yaml中items下添加如下内容:

- label: 外部输入
  name: INPUT
  type: upstream_component_output
  autoComplete: true
  input_type: artifacts
  description: 前序输入

type:upstream_component_output 表示使用前面任务的产出物,支持构建出的产物以及构建出的镜像。 目前支持构建的产物,例如Java构建的包数据如下:

{"ARTIFACT_URL":"https://rdc-build.aliyuncs.com/aone2/build-service/api/v2/ossproxy/download?ns=execution-component&bucketName=execution-component-rdc&fileId=aone2/2000860/1607602660253/default.tgz&fileName=default.tgz&md5Sign=02d27f4c5b81fa50c8ea1ad4676e4512","ARTIFACT_NAME":"default.tgz", "ARTIFACT_MD5":"369fbdeb124db1182f3ed56c5717aa31", "WEB_DOWNLOAD_URL":"execution-component&bucketName=execution-component-rdc&fileId=aone2%2F2000860%2F1607602660253%2Fdefault.tgz&artifactName=default.tgz"}

镜像构建的产物数据如下:

{"DOCKER_URL":"registry.cn-hongkong.aliyuncs.com/xiaoxuan/java-ceshi-spring-boot-demo:2020-12-10-20-38-01","ARTIFACT_URL":"https://rdc-build.aliyuncs.com/aone2/build-service/api/v2/ossproxy/download?ns=execution-component&bucketName=execution-component-rdc&fileId=aone2/2002689/1607603999672/application_docker_url_config.desc&fileName=application_docker_url_config.desc&md5Sign=4abee7adfc770e4dd943cb7302180d0e","ARTIFACT_MD5":"bf531410bfcf36c42b1735bb8c927edd"}

在步骤的src/index.ts可以通过以下代码获取到以上数据进行处理( JSON 格式化后获取字段)。

const input = process.env["INPUT"] as string
step.info(`INPUT=${input}`)

矮的

自定义步骤的产物输出,方便后续步骤使用

在step.yaml中加上以下内容:

- label: 制品名称
  name: ARTIFACT
  value: default
  export_to_output:
    type: artifact
    description: 自定义产出物名称,定义后在部署组件使用
    alias: 制品
    dynamicName: default
  type: input
  description: 制品名称为当前构建产物的名称。用于区分多次构建产生的不同产出物,定义后在部署组件使用。例如"default"

高的

在 src/index.ts 中加上以下修改:

其中ARTIFACT要和step.yaml中定义的name一样。

  • 导出 docker 镜像地址。

    const artifact = new step.artifact.CustomArtifactDocker({
        dockerURL: 'registry/namespace/repo:tag',
    });
    step.artifact.exportCustomArtifactDocker(`ARTIFACT`, artifact);
  • 导出制品地址。

    const artifact = new step.artifact.CustomArtifact({
        artifactURL: "fake_artifact_url"
    });
    step.artifact.exportCustomArtifact(`ARTIFACT`, artifact);

    ARTIFACT 的变量就可以在后面的步骤中获取到。高的 (1)矮的

配置服务链接,获取外部服务配置、账密等变量

参考以下不同类型代码实现

  1. step.yaml添加配置片段示例。

    items:
      - label: 
          en_US: Choose Service Connection
          zh_CN: 选择授权
        type: select
        name: SERVICE_CONNECTION_ID
        nameAlias: serviceConnection
        scType: oss
        rules:
          - require
        datasource:
          type: remote
          api: /base/service/credential/service/connection/list?scType=oss
          use_proxy: false
          searchable: true
          label: connectionName
          value: id
          createable:
            title:
              en_US: New Service Connection
              zh_CN: 新建服务授权
            desc:
              zh_CN: 新建服务授权
              en_US: New Service Connection
            type: dialog
            url: /ram
            permission: tb.role.serviceConnection.create
            scType: oss
            scTypeName:
              zh_CN: 阿里云对象存储服务
              en_US: Aliyun OSS
            component: addServiceConnection
          viewable:
            paramName: id
            url: /base/service/credential/service/connection
      - label:
          zh_CN: Bucket地域
          en_US: Bucket Region
        name: OSS_REGION
        nameAlias: region
        type: select
        rules:
          - require
        datasource:
          - label:
              en_US: Qingdao
              zh_CN: 华北1(青岛)
            value: cn-qingdao
          - label:
              en_US: Beijing
              zh_CN: 华北2(北京)
            value: cn-beijing
          - label:
              en_US: Zhangjiakou
              zh_CN: 华北3(张家口)
            value: cn-zhangjiakou
          - label:
              en_US: Huhehaote
              zh_CN: 华北5(呼和浩特)
            value: cn-huhehaote
          - label:
              en_US: Nanjing
              zh_CN: 华东5(南京)
            value: cn-nanjing
          - label:
              en_US: Wulanchabu
              zh_CN: 华北6(乌兰察布)
            value: cn-wulanchabu
          - label:
              en_US: Hangzhou
              zh_CN: 华东1(杭州)
            value: cn-hangzhou
          - label:
              en_US: Shanghai
              zh_CN: 华东2(上海)
            value: cn-shanghai
          - label:
              en_US: Shenzhen
              zh_CN: 华南1(深圳)
            value: cn-shenzhen
          - label:
              en_US: Heyuan
              zh_CN: 华南2(河源)
            value: cn-heyuan
          - label:
              en_US: Guangzhou
              zh_CN: 华南3(广州)
            value: cn-guangzhou
          - label:
              en_US: Chengdu
              zh_CN: 西南1(成都)
            value: cn-chengdu
          - label:
              en_US: Hong Kong
              zh_CN: 中国(香港)
            value: cn-hongkong
          - label:
              en_US: Tokyo
              zh_CN: 日本(东京)
            value: ap-northeast-1
          - label:
              en_US: Singapore
              zh_CN: 新加坡
            value: ap-southeast-1
          - label:
              en_US: Kuala Lumpur
              zh_CN: 马来西亚(吉隆坡)
            value: ap-southeast-3
          - label:
              en_US: Jakarta
              zh_CN: 印度尼西亚(雅加达)
            value: ap-southeast-5
          - label:
              en_US: Virginia
              zh_CN: 美国(弗吉尼亚)
            value: us-east-1
          - label:
              en_US: Silicon Valley
              zh_CN: 美国(硅谷)
            value: us-west-1
          - label:
              en_US: London
              zh_CN: 英国(伦敦)
            value: eu-west-1
          - label:
              en_US: Dubai
              zh_CN: 阿联酋(迪拜)
            value: me-east-1
          - label:
              en_US: Frankfurt
              zh_CN: 德国(法兰克福)
            value: eu-central-1
          - label:
              en_US: cn-north-2-gov-1
              zh_CN: 华北2-阿里政务云1
            value: cn-north-2-gov-1
      - label:
          en_US: Bucket Name
          zh_CN: Bucket名称
        name: OSS_BUCKET
        nameAlias: bucket
        extra:
          type: link-button
          url: https://oss.console.aliyun.com/bucket
          identifier: oss
        type: select
        rules:
          - require
        datasource:
          type: remote
          api: /base/service/credential/oss/bucket/list?ossRegion=${OSS_REGION}&serviceConnectionId=${SERVICE_CONNECTION_ID}
          use_proxy: false
          searchable: true
  2. src/index.ts 里通过以下代码获取配置真实值。

    const flowJobToken: string | undefined =
        process.env['FLOW_JOB_TOKEN']
    if (flowJobToken == undefined) {
        throw new Error('missing FLOW_JOB_TOKEN')
    }
    
    const ossRamCertificate = await step.certificate.getOssRamServiceConnectionCertificate(flowJobToken,process.env.SERVICE_CONNECTION_ID as string)
    if (ossRamCertificate == undefined || ossRamCertificate.accessKeyId == undefined) {
        throw new Error(`got OssRamServiceConnectionCertificate but error: ${JSON.stringify(ossRamCertificate)}`)
    }
    
    const endpoint = `oss-${process.env.OSS_REGION as string}.aliyuncs.com`
    const accessKeyID = ossRamCertificate.accessKeyId;
    const accessKeySecret = ossRamCertificate.accessKeySecret;
    const securityToken = ossRamCertificate.securityToken;
    const bucket = process.env.OSS_BUCKET as string;
    
    step.info("-------------------oss----------------------")
    step.info(endpoint)
    step.info(accessKeyID)
    step.info(accessKeySecret)
    step.info(securityToken)
    step.info("-------------------oss----------------------")

服务链接支持类型

参考代码

MavenSettings

https://atomgit.com/flow-step/SetupMavenSettings/blob/main/src/setup.ts#L5

Npmrc

https://atomgit.com/flow-step/SetupNpmrc/blob/main/src/index.ts#L17

SetupNetrcCodeup

https://atomgit.com/flow-step/SetupNetrcCodeup/blob/main/src/setup.ts#L31

OSSDownload

https://atomgit.com/flow-step/OSSDownload/blob/master/src/ossDownload.ts#L18

OSSUpload

https://atomgit.com/flow-step/OSSUpload/blob/master/src/ossUpload.ts#L30

DockerLogin

https://atomgit.com/flow-step/DockerLogin/blob/main/src/setup.ts#L9

DockerBuildPushACR

https://atomgit.com/flow-step/DockerBuildPushACR/blob/master/src/login.ts#L7

DockerBuildPushACREE

https://atomgit.com/flow-step/DockerBuildPushACREE/blob/main/src/login.ts#L7

KubectlApply

https://atomgit.com/flow-step/KubectlApply/blob/main/src/certificate.ts#L6